開發中遇到需要處理【如果是...就要...】的情境時,Vue 提供了 v-if 指令來幫助我們根據條件進行元素的渲染。這樣可以在特定條件滿足時動態地顯示或隱藏某些元素。
v-if 指令
通過動態
添加或移除 DOM 元素的方式來控制組件的顯示。當條件為true
時,組件會被創建並插入到 DOM 中;當條件為false
時,組件則會被銷毀並從 DOM 中移除。
在處理多個條件時,可以結合v-else-if
和v-else
指令來優化條件邏輯,使應用能夠根據不同情況渲染對應的內容:
true
時渲染對應的元素。v-else-if
指令。當前面的v-if
條件為false
且當前條件為true
時,渲染對應的元素。v-if
和v-else-if
條件都為false
時,渲染對應的元素。可以用於預設值的呈現。👉 Vue3 Options API v-if、v-else-if 及 v-else 指令實作連結
以下透過一個漢堡點餐範例來說明:
Vue Template:
<div id="app">
<h1>當前飢餓狀態</h1>
<h2 v-if="status === 'large'">
吃得飽飽的,真開心!
</h2>
<h2 v-else-if="status === 'midium'">
肚子不會餓,但還有點嘴饞!
</h2>
<h2 v-else-if="status === 'small'">
吃太少反而更想吃QQ
</h2>
<h2 v-else>
可以點餐吃了嗎?好餓!
</h2>
<div class="container">
🍔 點餐櫃檯
<div class="product-item">
<p>餐點說明:漢堡 + 中薯 + 中杯可樂</p>
<button @click="orderFood('large')">大麥克套餐</button>
</div>
<div class="product-item">
<p>餐點說明:小杯可樂 + 法式芥末香鷄堡</p>
<button @click="orderFood('midium')">1 + 1 套餐</button>
</div>
<div class="product-item">
<p>餐點說明:小薯</p>
<button @click="orderFood('small')">單點小薯</button>
</div>
</div>
</div>
javaScript:
const rootComponent = {
data(){
return{
status: '',
}
},
methods:{
// 點餐行動
orderFood(type){
this.status = type;
}
}
}
這部分也可以使用計算屬性進行改寫,使模板變得更簡潔和易於閱讀。
計算屬性
可以將條件邏輯從模板中分離出來,避免直接在模板中編寫過多的邏輯判斷,從而提升代碼的可維護性與可讀性。這樣的改寫方式有助於保持模板的乾淨簡明,讓條件處理變得更加清晰。
👉 Vue3 Options API 使用計算屬性改寫實作連結
部分 Vue Template:
<h2>
{{ getDescription }}
</h2>
...略
部分 JavaScript:
computed: {
getDescription() {
if (this.status === "large") {
return "吃得飽飽的,真開心!";
} else if (this.status === "midium") {
return "肚子不會餓,但還有點嘴饞!";
} else if (this.status === "small") {
return "吃太少反而更想吃QQ";
} else {
return "可以點餐吃了嗎?好餓!";
}
}
}
...略
v-if
指令必須綁定在具體的元素上,但如果需要根據條件渲染多個元素的區塊,無法直接將v-if
應用於多個元素。
要實現多個元素的條件渲染,可以使用<template>
標籤來包裹這些元素。<template>
標籤本身不會被渲染到 HTML DOM 中,而是作為一個不可見的包裹容器,用於根據條件動態渲染整個區塊的內容。這樣可以方便地對多個元素進行條件判斷,而不影響實際的 DOM 結構。
以下用文章專欄的範例,說明template
標籤根據條件渲染區塊的情形:
👉 Vue3 Options API template標籤搭配 v-if、v-else 指令使用實作連結
Vue Template:
<div id="app">
<div class="container">
<template v-if="selectSection === 'section1'">
<section class="section1">
<h2>勝利專欄</h2>
<div class="content">
Lorem, ipsum dolor sit amet consectetur adipisicing elit. Vel nam debitis ut?
</div>
</section>
</template>
<template v-else>
<section v-else class="section2" v-else>
<h2>失敗專欄</h2>
<div class="content">
Ad mollitia fugit, facilis, nulla veritatis harum libero nobis non magnam deleniti eius omnis atque id in.
</div>
</section>
</template>
<button @click="changeSection" type="button" class="mt-4">切換顯示不同文章區塊</button>
</div>
</div>
JavaScript:
const rootComponent = {
data(){
return{
selectSection: 'section1'
}
},
methods:{
changeSection(){
return this.selectSection = this.selectSection === 'section1' ? 'section2' : 'section1';
}
}
}
v-show 指令通過設置CSS display
屬性來控制元素的顯示與隱藏。
用法與v-if
相近,但有以下限制:
template
標籤上,因為 template 本身不會渲染為具體的 DOM 元素。v-else-if
和v-else
指令結合使用,因為它只控制當前元素的顯示與隱藏。以下將以彈窗案例舉例:
👉 Vue3 Options API v-show 顯示彈窗實作連結
Vue Template:
<div id="app">
<button @click="changeModal">切換彈窗</button>
<div v-show="showModal" class="modal ">
這是個對話框
</div>
</div>
JavaScript:
const rootComponent = {
data() {
return{
showModal: false
}
},
methods:{
changeModal(){
this.showModal = !this.showModal;
}
}
}
v-else-if
和v-else
指令搭配使用,當涉及多個元素區塊的切換時,可以使用<template>
標籤來包裹這些區塊,以達到條件渲染效果。CSS display
屬性來顯示或隱藏元素。它無法與v-else-if
和v-else
一起使用,也不能應用在<template>
標籤上。練習上面使用的v-if
跟v-else
試著完成今天的小練習。
根據不同登入狀態決定要顯示的導覽列會員身份是訪客還是已登入狀態,僅需調整template
的部分。
👉 Vue3 Options API v-if 和 v-else 登入練習模板連結
👉 Vue3 Options API v-if 和 v-else 登入練習完成版實作連結